package com.pl.service.impl;

import com.pl.dao.UserMapper;
import com.pl.domain.User;
import com.pl.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.ExceptionHandler;

/**
 * @author shent
 */
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserMapper mapper;

    @Override
    public User getUserByUsername(String username) {
        return mapper.getUserByName(username);
    }

    /**
     * 事务
     * 1.Spring Boot 默认的事务规则是遇到运行异常（RuntimeException）和程序错误（Error）才会回滚
     * 所以要想所有异常都要回滚,必须添加 rollbackFor = Exception.class
     * 2.我们在处理异常时，有两种方式，要么抛出去，让上一层来捕获处理；
     * 要么把异常 try catch 掉，在异常出现的地方给处理掉。就因为有这中 try…catch，所以导致异常被 ”吃“ 掉，事务无法回滚。
     * 所以不要在加了事务的方法中 catch 异常
     * 3.synchronized 和 @Transactional 一起使用时, 锁会失效
     * 因为业务代码完成之后,事务未提交之前,进来新的线程访问数据库,仍然是未改变的数据
     * 要想避免锁失效,一种方法是把事务去掉(不推荐),另一种方法是在调用这个 事务方法的地方加锁,使锁的范围比事务范围大
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insertUser(User user) {
        return 0;
    }

    @Override
    public User getUser() {
        return mapper.getUserByName("shent");
    }
}
